package com.samuel.blog.utils;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.log4j.Logger;

/**
 * 工具类 - MD5加密
 * 
 * @author 开机
 *
 */
public class Md5Utils {

	private static final Logger log = Logger.getLogger(Md5Utils.class);

	/**
	 * md5加密（ITS）
	 * 
	 * @param args
	 */
	@SuppressWarnings("unused")
	public synchronized static final String getMD5Str(String str) {

		MessageDigest messageDigest = null;
		String charset = "iso8859-1";
		try {
			messageDigest = MessageDigest.getInstance("MD5");
			messageDigest.reset();

			/**
			 * String.getByte("utf-8")和new String(byte[],"utf-8")各是什么意思？ 1.
			 * 返回String解码为utf-8的字节序列； 2. 使用指定字符集解码的字节数组构造一个新的String。
			 */
			if (charset == null) {
				messageDigest.update(str.getBytes());
			} else {
				messageDigest.update(str.getBytes(charset));
			}

		} catch (NoSuchAlgorithmException e) {
			log.error("md5 error:" + e.getMessage(), e);
		} catch (UnsupportedEncodingException e) {
			log.error("md5 error:" + e.getMessage(), e);
		}
		byte[] byteArray = messageDigest.digest();
		StringBuffer md5Strbuf = new StringBuffer();

		for (int i = 0; i < byteArray.length; i++) {
			/**
			 * java代码中Integer.toHexString(b&0xff) 括号中为什么要写b&0xff 把整数转换成16进制字符串
			 */
			if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) {
				md5Strbuf.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
			} else {
				md5Strbuf.append(Integer.toHexString(0xFF & byteArray[i]));
			}
		}
		return md5Strbuf.toString();
	}

	// 测试结果
	public static void main(String[] args) {
		// 汉字编码格式影响MD5密码生成结果
		String pwd = "黄12345";
		String md5 = getMD5Str(pwd);
		System.out.println(md5);
		System.out.println(md5.length());
	}
}
